<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .p {
            width: 400px;
            height: 400px;
            border: 1px solid #000;
        }

        .s {
            width: 100px;
            height: 100px;
            background-color: aqua;
            /* 目的是为了设置元素的位置 */
            position: relative;
            /* 解决元素移动过程中闪烁问题 */
            pointer-events:none;
        }
    </style>
</head>

<body>
    <div class="p">
        <div class="s"></div>
    </div>
    <script>
        // 获取元素对象
        var p = document.querySelector('.p')
        var s = p.querySelector('.s')
        // 可以通过一个变量记录鼠标按键的状态: 按下/松开
        // 0表示松开状态; 1表示鼠标按键是按下的状态
        var mouseState = 0
        p.onmousedown = function () {
            // 更新鼠标按键状态
            mouseState = 1
        }
        p.onmouseup = function () {
            // 更新鼠标按键状态
            mouseState = 0
        }
        // 为什么要给父元素注册mousemove事件:为了获取鼠标指针相对于父元素的坐标
        p.onmousemove = function (e) {
            if (mouseState === 1) {
                // 获取鼠标指针相对于当前元素的坐标
                var offsetX = e.offsetX
                var offsetY = e.offsetY
                // console.log(offsetX, offsetY);
                // 计算移动距离
                var moveX = offsetX - 50
                var moveY = offsetY - 50
                // 判断移动距离是否超过了最大最小值
                if (moveX < 0) moveX = 0
                if (moveX > 300) moveX = 300
                if (moveY < 0) moveY = 0
                if (moveY > 300) moveY = 300
                // 移动子元素
                s.style.left = moveX + 'px'
                s.style.top = moveY + 'px'
            }
        }

    </script>
</body>

</html>